package ihm;

import controller.SimulationControleur;
import controller.TacheSimulation;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import model.Date;

/**
 * Classe qui affiche, dans la partie gauche de la fenêtre, le panel nommé "Statistiques".
 * 
 * @author Jason
 */
public class PanelStatistiques extends JPanel {
	
	private static final long serialVersionUID = 1L;
	
	private final String STATISTIQUES = "Statistiques";
	private final String DEBUT = "Début";
	private final String FIN = "Fin";
	private final String H = "h";
	private final String CALCULER_STATISTIQUES = "Calculer les statistiques";
	
	private Font policeTitres = new Font("Dialog",Font.BOLD,14);
	
	private JLabel lblStatistiques;
	private JLabel lblStatistiquesDebut;
	private JLabel lblStatistiquesFin;
	private JLabel lblhDebut;
	private JLabel lblhFin;
	
	private JTextField tfStatsHeureDebut;
	private JTextField tfStatsMinDebut;
	private JTextField tfStatsHeureFin;
	private JTextField tfStatsMinFin;
	
	private JButton btnCalculerStatistiques;

	private JPanel panelSaisies;
        
        private SimulationControleur simulationControleur;
        private IHMSimulation iHMSimulation;
	
	/**
	 * Constructeur.
	 */
	public PanelStatistiques(IHMSimulation iHMSimulation, SimulationControleur simulationControleur) {
		this.iHMSimulation = iHMSimulation;
                this.simulationControleur = simulationControleur;
		lblStatistiques = new JLabel(STATISTIQUES);
		lblStatistiques.setFont(policeTitres);
		
		lblStatistiquesDebut = new JLabel(DEBUT);
		lblStatistiquesFin = new JLabel(FIN);
		lblhDebut = new JLabel(H);
		lblhFin = new JLabel(H);
		
		tfStatsHeureDebut = new JTextField("00");
		tfStatsMinDebut = new JTextField("00");
		tfStatsHeureFin = new JTextField("23");
		tfStatsMinFin = new JTextField("59");
		
		btnCalculerStatistiques = new JButton(CALCULER_STATISTIQUES);
	    
		this.creerMarges();
		this.creerPanelSaisies();
		this.definirLayout();
                this.ajouterEcouteurs();
	}
	
	/**
	 * Créé les marges qui permettent de créer un espace autour du contenu du JPanel.
	 */
	private void creerMarges() {
		this.setBorder(
				BorderFactory.createEmptyBorder(
						20,20,20,20
				)
		);
	}

	/**
	 * Construit le panel contenant les zones de saisies des heures.
	 */
	private void creerPanelSaisies() {
	    //Construction du tableau.
	    GridBagLayout gbl = new GridBagLayout();
	    GridBagConstraints gbc = new GridBagConstraints();
	    panelSaisies = new JPanel();
	    
	    //gridx : gestion des colonnes.
	    //gridy : gestion des lignes.
	    panelSaisies.setLayout(gbl);
	    
	    gbc.gridx = 0;
	    gbc.gridy = 0;
	    gbc.ipadx = 20;
	    panelSaisies.add(lblStatistiquesDebut, gbc);
	    gbc.gridx = 1;
	    gbc.gridy = 0;
	    gbc.ipadx = 30;
	    panelSaisies.add(tfStatsHeureDebut, gbc);
	    gbc.gridx = 2;
	    gbc.gridy = 0;
	    gbc.ipadx = 0;
	    gbc.insets = new Insets(0,5,0,5);
	    panelSaisies.add(lblhDebut, gbc);
	    gbc.gridx = 3;
	    gbc.gridy = 0;
	    gbc.ipadx = 30;
	    panelSaisies.add(tfStatsMinDebut, gbc);
	    
	    gbc.gridx = 0;
	    gbc.gridy = 1;
	    gbc.ipadx = 20;
	    panelSaisies.add(lblStatistiquesFin, gbc);
	    gbc.gridx = 1;
	    gbc.gridy = 1;
	    gbc.ipadx = 30;
	    panelSaisies.add(tfStatsHeureFin, gbc);
	    gbc.gridx = 2;
	    gbc.gridy = 1;
	    gbc.ipadx = 0;
	    gbc.insets = new Insets(0,5,0,5);
	    panelSaisies.add(lblhFin, gbc);
	    gbc.gridx = 3;
	    gbc.gridy = 1;
	    gbc.ipadx = 30;
	    panelSaisies.add(tfStatsMinFin, gbc);
	}
	
	
	/**
	 * Met en forme le panel.
	 */
	private void definirLayout() {
		GroupLayout layout = new GroupLayout(this);
		this.setLayout(layout);
		
		layout.setHorizontalGroup(
			layout.createParallelGroup(GroupLayout.Alignment.CENTER)
				.addComponent(lblStatistiques)
				.addComponent(panelSaisies)
				.addComponent(btnCalculerStatistiques)
		);
		
 		layout.setVerticalGroup(
            layout.createSequentialGroup()
				.addComponent(lblStatistiques)
				.addComponent(panelSaisies)
				.addComponent(btnCalculerStatistiques)
 		);
	}

    private void ajouterEcouteurs() {
        btnCalculerStatistiques.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try{
                    if(simulationControleur.isSimuEnCours()) {
                        JOptionPane.showMessageDialog(null, "Vous ne pouvez pas calculer les stats pendant la simulation", "Action interdite", JOptionPane.ERROR_MESSAGE);
                    } else if(!simulationControleur.getBatiment().getTrajets().isEmpty()) {
                        Date dateDebut = new Date(Integer.valueOf(tfStatsHeureDebut.getText()), Integer.valueOf(tfStatsMinDebut.getText()), 0);
                        Date dateFin = new Date(Integer.valueOf(tfStatsHeureFin.getText()), Integer.valueOf(tfStatsMinFin.getText()), 59);
                        new IHMStatistique(iHMSimulation,simulationControleur.getBatiment(),dateDebut,dateFin).setVisible(true);
                    } else {
                        JOptionPane.showMessageDialog(null, "Il n'y a pas de stats à calculer", "Pas de stats", JOptionPane.ERROR_MESSAGE);
                    }
                } catch(Exception ex) {
                    Logger.getLogger(TacheSimulation.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null, ex.getMessage(), "Erreur stats", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }
}
